package com.zenithmind.task.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.task.pojo.entity.Task;
import com.zenithmind.task.pojo.query.TaskQuery;
import com.zenithmind.task.pojo.vo.TaskVO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 任务服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface TaskService extends IService<Task> {

    // ==================== 基础CRUD操作 ====================

    /**
     * 分页查询任务列表
     *
     * @param query 任务查询条件
     * @param userId 当前用户ID
     * @return 任务分页列表
     */
    PageResult<TaskVO> getTaskPage(TaskQuery query, String userId);

    /**
     * 根据ID查询任务详情
     * 
     * @param id 任务ID
     * @param userId 当前用户ID
     * @return 任务详情
     */
    TaskVO getTaskById(String id, String userId);

    /**
     * 创建任务
     * 
     * @param task 任务信息
     * @param userId 创建者ID
     * @return 创建结果
     */
    Boolean createTask(Task task, String userId);

    /**
     * 更新任务
     * 
     * @param task 任务信息
     * @param userId 操作者ID
     * @return 更新结果
     */
    Boolean updateTask(Task task, String userId);

    /**
     * 删除任务
     * 
     * @param id 任务ID
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean deleteTask(String id, String userId);

    /**
     * 批量删除任务
     * 
     * @param ids 任务ID列表
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean batchDeleteTasks(List<String> ids, String userId);

    // ==================== 任务状态管理 ====================

    /**
     * 更新任务状态
     * 
     * @param id 任务ID
     * @param status 新状态
     * @param userId 操作者ID
     * @param remark 备注
     * @return 更新结果
     */
    Boolean updateTaskStatus(String id, Integer status, String userId, String remark);

    /**
     * 开始任务
     * 
     * @param id 任务ID
     * @param userId 操作者ID
     * @return 开始结果
     */
    Boolean startTask(String id, String userId);

    /**
     * 完成任务
     * 
     * @param id 任务ID
     * @param userId 操作者ID
     * @param actualHours 实际工时
     * @param completionNote 完成说明
     * @return 完成结果
     */
    Boolean completeTask(String id, String userId, Double actualHours, String completionNote);

    /**
     * 暂停任务
     * 
     * @param id 任务ID
     * @param userId 操作者ID
     * @param reason 暂停原因
     * @return 暂停结果
     */
    Boolean pauseTask(String id, String userId, String reason);

    /**
     * 取消任务
     * 
     * @param id 任务ID
     * @param userId 操作者ID
     * @param reason 取消原因
     * @return 取消结果
     */
    Boolean cancelTask(String id, String userId, String reason);

    // ==================== 任务分配管理 ====================

    /**
     * 分配任务
     * 
     * @param taskId 任务ID
     * @param assigneeId 被分配人ID
     * @param assignmentType 分配类型
     * @param rolePermission 角色权限
     * @param note 分配说明
     * @param userId 分配人ID
     * @return 分配结果
     */
    Boolean assignTask(String taskId, String assigneeId, Integer assignmentType, 
                      Integer rolePermission, String note, String userId);

    /**
     * 批量分配任务
     * 
     * @param taskId 任务ID
     * @param assigneeIds 被分配人ID列表
     * @param assignmentType 分配类型
     * @param userId 分配人ID
     * @return 分配结果
     */
    Boolean batchAssignTask(String taskId, List<String> assigneeIds, Integer assignmentType, String userId);

    /**
     * 取消任务分配
     * 
     * @param taskId 任务ID
     * @param assigneeId 被分配人ID
     * @param userId 操作者ID
     * @return 取消结果
     */
    Boolean unassignTask(String taskId, String assigneeId, String userId);

    /**
     * 接受任务分配
     * 
     * @param assignmentId 分配ID
     * @param userId 用户ID
     * @return 接受结果
     */
    Boolean acceptAssignment(String assignmentId, String userId);

    /**
     * 拒绝任务分配
     * 
     * @param assignmentId 分配ID
     * @param reason 拒绝原因
     * @param userId 用户ID
     * @return 拒绝结果
     */
    Boolean rejectAssignment(String assignmentId, String reason, String userId);

    // ==================== 任务进度管理 ====================

    /**
     * 更新任务进度
     * 
     * @param id 任务ID
     * @param progress 进度（0-100）
     * @param userId 操作者ID
     * @param note 进度说明
     * @return 更新结果
     */
    Boolean updateTaskProgress(String id, Integer progress, String userId, String note);

    /**
     * 记录工时
     * 
     * @param id 任务ID
     * @param hours 工时
     * @param description 工作描述
     * @param userId 操作者ID
     * @return 记录结果
     */
    Boolean logWorkHours(String id, Double hours, String description, String userId);

    // ==================== 子任务管理 ====================

    /**
     * 创建子任务
     * 
     * @param parentId 父任务ID
     * @param subtask 子任务信息
     * @param userId 创建者ID
     * @return 创建结果
     */
    Boolean createSubtask(String parentId, Task subtask, String userId);

    /**
     * 查询子任务列表
     * 
     * @param parentId 父任务ID
     * @param userId 当前用户ID
     * @return 子任务列表
     */
    List<TaskVO> getSubtasks(String parentId, String userId);

    /**
     * 移动子任务
     * 
     * @param taskId 任务ID
     * @param newParentId 新父任务ID
     * @param userId 操作者ID
     * @return 移动结果
     */
    Boolean moveSubtask(String taskId, String newParentId, String userId);

    // ==================== 任务依赖管理 ====================

    /**
     * 添加任务依赖
     * 
     * @param predecessorId 前置任务ID
     * @param successorId 后续任务ID
     * @param dependencyType 依赖类型
     * @param lagDays 延迟天数
     * @param userId 操作者ID
     * @return 添加结果
     */
    Boolean addTaskDependency(String predecessorId, String successorId, Integer dependencyType, 
                             Integer lagDays, String userId);

    /**
     * 移除任务依赖
     * 
     * @param dependencyId 依赖ID
     * @param userId 操作者ID
     * @return 移除结果
     */
    Boolean removeTaskDependency(String dependencyId, String userId);

    // ==================== 任务关注管理 ====================

    /**
     * 关注任务
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 关注结果
     */
    Boolean followTask(String taskId, String userId);

    /**
     * 取消关注任务
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 取消结果
     */
    Boolean unfollowTask(String taskId, String userId);

    // ==================== 任务查询方法 ====================

    /**
     * 查询我的任务
     *
     * @param query 任务查询条件
     * @param userId 用户ID
     * @return 任务列表
     */
    PageResult<TaskVO> getMyTasks(TaskQuery query, String userId);

    /**
     * 查询我创建的任务
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 任务列表
     */
    PageResult<TaskVO> getMyCreatedTasks(String userId, Integer pageNum, Integer pageSize);

    /**
     * 查询我关注的任务
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 任务列表
     */
    PageResult<TaskVO> getMyFollowedTasks(String userId, Integer pageNum, Integer pageSize);

    /**
     * 查询逾期任务
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 任务列表
     */
    PageResult<TaskVO> getOverdueTasks(String userId, Integer pageNum, Integer pageSize);

    /**
     * 查询今日任务
     * 
     * @param userId 用户ID
     * @return 任务列表
     */
    List<TaskVO> getTodayTasks(String userId);

    /**
     * 查询本周任务
     * 
     * @param userId 用户ID
     * @return 任务列表
     */
    List<TaskVO> getWeekTasks(String userId);

    // ==================== 任务统计方法 ====================

    /**
     * 获取任务统计信息
     * 
     * @param userId 用户ID
     * @param projectId 项目ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息
     */
    Map<String, Object> getTaskStatistics(String userId, String projectId, 
                                         LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取任务完成趋势
     * 
     * @param userId 用户ID
     * @param days 天数
     * @return 趋势数据
     */
    List<Map<String, Object>> getTaskCompletionTrend(String userId, Integer days);

    /**
     * 获取任务优先级分布
     * 
     * @param userId 用户ID
     * @param projectId 项目ID
     * @return 分布数据
     */
    List<Map<String, Object>> getTaskPriorityDistribution(String userId, String projectId);

    // ==================== 任务模板方法 ====================

    /**
     * 从模板创建任务
     * 
     * @param templateId 模板ID
     * @param customData 自定义数据
     * @param userId 创建者ID
     * @return 创建结果
     */
    Boolean createTaskFromTemplate(String templateId, Map<String, Object> customData, String userId);

    /**
     * 保存为模板
     * 
     * @param taskId 任务ID
     * @param templateName 模板名称
     * @param userId 创建者ID
     * @return 保存结果
     */
    Boolean saveAsTemplate(String taskId, String templateName, String userId);

    // ==================== 任务导入导出 ====================

    /**
     * 导出任务
     * 
     * @param taskIds 任务ID列表
     * @param format 导出格式
     * @param userId 操作者ID
     * @return 导出文件路径
     */
    String exportTasks(List<String> taskIds, String format, String userId);

    /**
     * 导入任务
     * 
     * @param filePath 文件路径
     * @param userId 操作者ID
     * @return 导入结果
     */
    Map<String, Object> importTasks(String filePath, String userId);
}
